# 1.通过切片反转字符串
test_str = "abcdefghijklmnopqrstuvwxyz"

new_reversed_str = test_str[::-1]

print("通过切片反转的字符串=", new_reversed_str)


#  2.通过range对象迭代字符串先转换list，然后再join
char_list = []
for i in range(len(test_str) - 1, -1, -1):
    char_list.append(test_str[i])


print("通过for循环迭代字符串后，再join", "".join(char_list))

# 3.通过reversed+join方法实现反转
new_reversed_str = reversed(test_str)  # <reversed object at 0x1005ad300>
print("通过reversed+join方法实现反转=", "".join(new_reversed_str))


# 4.先把字符串转换列表，然后再把列表进行反转，反转后，再通过join函数进行连接
new_str_list = list(test_str)
new_str_list.reverse()  # 数组反转，类似js中数组reverse函数

print("先把字符串转换列表，再reverse后，再join=", "".join(new_str_list))

# 5 通过递归实现

nums_str = "123"
print(nums_str[1:], nums_str[0])


def recure_reverse_str(_str) -> str:
    print("_str===", _str)
    if len(_str) == 0:
        return _str

    else:
        return recure_reverse_str(_str[1:]) + _str[0]


# 第一次程序执行栈信息
# return recure_reverse_str(23) + 1  ==>1

# 第二次执行栈信息，在23的基础上
# 23=_str[1:] =3
# return recure_reverse_str(3) + 2  ==> 2

# 第三次执行栈信息 在 3 基础上
# str="3" str[1:] = ""  ==>3
#


print(f"通过递归实现{nums_str}的反转=", recure_reverse_str(nums_str))

# 通过尾递归来优化


def tail_recur_reverse_str(_str, lastAcc="") -> str:
    """
    尾递归来优化递归，把前一次积累的结果传递给下一次递归
    num_strs="123"
    """

    if len(_str) == 0:
        return lastAcc
    else:
        return tail_recur_reverse_str(_str[1:], _str[0] + lastAcc)


#  程序执行栈信息
#  第一次 return tail_recur_reverse_str("23", 1+"")
#  第二次 return tail_recur_reverse_str("3","2+1")
#  第三次 return tail_recur_reverse_str("", "3"+"21")

# 6 通过循环递归的形式来实现


def loop_recur_reverse_str(_str) -> str:
    """
    通过循环递归的形式来实现
    nums_str="1234"
    """

    temp_list = []

    def generate_get_one_char_in_strs():
        max_index = len(_str)
        yield
        while max_index >= 0:
            max_index -= 1
            yield _str[max_index]
            continue

    # 得到生成器函数
    gen = generate_get_one_char_in_strs()

    # 启动生成器，到第一个yield出停止并返回
    next(gen)
    max_index = len(_str) - 1

    while max_index >= 0:
        one_char = gen.__next__()
        temp_list.append(str(one_char))
        max_index -= 1

    return "".join(temp_list)


print("通过生成器实现反转=", loop_recur_reverse_str("123456789"))
